package com.situ.skymall.admin.api.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.situ.admin.model.Admin;
import com.situ.admin.service.AdminService;
import com.situ.skymall.admin.api.service.ImageFeignService;
import com.situ.utils.JsonResult;
import org.jasypt.util.password.StrongPasswordEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDateTime;

/**
 * 管理员控制器
 */
@RestController
@RequestMapping("/api/v1/admin")
public class AdminController {

    private static AdminService adminService;
    private final StrongPasswordEncryptor PE = new StrongPasswordEncryptor(); // 添加这一行
    private final ImageFeignService imageFeignService;

    @Autowired
    public AdminController(ImageFeignService imageFeignService) {
        this.imageFeignService = imageFeignService;
    }

    @Autowired
    public void setAdminService(AdminService adminService){
        AdminController.adminService = adminService;
    }

    /**
     * 查询所有管理员
     */
    @GetMapping("/findAll")
    public JsonResult<?> findAll(
            @RequestParam(defaultValue = "1") int pageNum,
            @RequestParam(defaultValue = "5") int pageSize,
            Admin search){
        Page<Admin> page = adminService.findAll(pageNum, pageSize, search);
        return JsonResult.success(page);
    }


    /**
     * 根据管理员id查询管理员
     */
    @GetMapping("/findById/{id}")
    public JsonResult<?> findById(@PathVariable Integer id) {
        try {
            Admin admin = adminService.getById(id);
            if (admin == null) {
                return JsonResult.fail("管理员不存在");
            }
            return JsonResult.success(admin);
        } catch (Exception e) {
            return JsonResult.fail(500, "查询管理员失败");
        }
    }


    /**
     * 根据管理员名查询管理员
     */
    @GetMapping("/findByAdminname/{adminname}")
    public JsonResult<?> findByAdminname(@PathVariable String adminname) {
        try {
            Admin admin = adminService.findByAdminname(adminname);
            if (admin == null) {
                return JsonResult.fail("管理员不存在");
            }
            return JsonResult.success(admin);
        } catch (Exception e) {
            return JsonResult.fail(500, "查询管理员失败");
        }
    }

    /**
     * 修改管理员状态
     */
    @PutMapping("/status/{id}/{status}")
    public JsonResult<?> updateStatus(@PathVariable Integer id, @PathVariable Integer status) {
        try {
            // 检查管理员是否存在
            Admin admin = adminService.getById(id);
            if (admin == null) {
                return JsonResult.fail("管理员不存在");
            }

            boolean result = adminService.updateStatus(id, status);
            if (result) {
                return JsonResult.success("状态更新成功");
            } else {
                return JsonResult.fail("状态更新失败");
            }
        } catch (Exception e) {
            return JsonResult.fail(500, "状态更新过程中发生错误");
        }
    }

    /**
     * 新增管理员
     */
    @PostMapping("/add")
    public JsonResult<?> addAdmin(@RequestBody Admin admin) {
        try {
            // 检查管理员名是否已存在
            Admin existingAdmin = adminService.findByAdminname(admin.getAdminname());
            if (existingAdmin != null) {
                return JsonResult.fail("管理员名已存在");
            }
            // 密码加密
            admin.setPassword(PE.encryptPassword(admin.getPassword()));
            // 设置创建和更新时间
            admin.setCreatedAt(LocalDateTime.now());
            admin.setUpdatedAt(LocalDateTime.now());

            boolean result = adminService.save(admin);
            if (result) {
                return JsonResult.success("新增管理员成功");
            } else {
                return JsonResult.fail("新增管理员失败");
            }
        } catch (Exception e) {
            return JsonResult.fail(500, "新增管理员过程中发生错误");
        }
    }

    /**
     * 修改管理员角色
     */
    @PutMapping("/role/{id}/{roleType}")
    public JsonResult<?> updateRoleType(@PathVariable Integer id, @PathVariable Integer roleType) {
        try {
            // 检查管理员是否存在
            Admin admin = adminService.getById(id);
            if (admin == null) {
                return JsonResult.fail("管理员不存在");
            }

            boolean result = adminService.updateRoleType(id, roleType);
            if (result) {
                return JsonResult.success("角色更新成功");
            } else {
                return JsonResult.fail("角色更新失败");
            }
        } catch (Exception e) {
            return JsonResult.fail(500, "角色更新过程中发生错误");
        }
    }
    /**
     * 管理员信息更新
     */
    @PutMapping("/update")
    public JsonResult<?> update(@RequestBody Admin admin) {
        try {
            // 检查管理员是否存在
            Admin existAdmin = adminService.getById(admin.getId());
            if (existAdmin == null) {
                return JsonResult.fail("管理员不存在");
            }

            boolean result = adminService.updateById(admin);
            if (result) {
                return JsonResult.success("管理员信息更新成功");
            } else {
                return JsonResult.fail("管理员信息更新失败");
            }
        } catch (Exception e) {
            return JsonResult.fail(500, "管理员信息更新过程中发生错误");
        }
    }

    /**
     * 管理员信息删除
     */
    @DeleteMapping("/delete/{id}")
    public JsonResult<?> deleteAdmin(@PathVariable Integer id) {
        try {
            // 检查管理员是否存在
            Admin admin = adminService.getById(id);
            if (admin == null) {
                return JsonResult.fail("管理员不存在");
            }

            boolean result = adminService.deleteAdmin(id);
            if (result) {
                return JsonResult.success("管理员删除成功");
            } else {
                return JsonResult.fail("管理员删除失败");
            }
        } catch (Exception e) {
            return JsonResult.fail(500, "管理员删除过程中发生错误");
        }
    }

    /**
     * 管理员头像上传
     */
    @PostMapping("/avatar")
    public JsonResult<?> uploadAvatar(MultipartFile file) {
        try {
            if (file == null || file.isEmpty()) {
                return JsonResult.fail("文件不能为空");
            }

            // 通过 Feign 客户端调用 image-api
            ResponseEntity<JsonResult<String>> response = imageFeignService.upload(file);

            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null && response.getBody().isSuccess()) {
                return JsonResult.success(response.getBody().getData());
            } else {
                return JsonResult.fail("头像上传失败");
            }
        } catch (Exception e) {
            // 记录日志 e.printStackTrace();
            return JsonResult.fail("头像上传过程中发生错误");
        }
    }
}
